package atguigu.boot.config;

import atguigu.boot.bean.Pet;
import atguigu.boot.bean.User;
import ch.qos.logback.core.db.DBHelper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单实例
 * 2、配置类本身也是组件
 *3、proxyBeanMethods：代理bean的方法
 *  Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 *  List(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 *  组件依赖必须使用Full模式默认。其他模式使用List模式
 *
 *4、@Import({User.class, DBHelper.class})
 *     给容器中自动创建出这两个类型的组件,默认组件名字就是全类名
 *
 **/
//1.添加@Configuration
// 告诉SpringBoot这是一个  配置类==配置文件
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(name="tomcat")//条件装配
//@ConditionalOnMissingBean(name="tomcat")
public class MyConfig {

    //2.添加@Bean注解
    // 给容器中添加组件。以方法名作为组件的id，
    //返回的类型就是注解的类型，返回的值就是组件在容器中的实例
    //外部无论对配置类中的这个组件注册方法调用多少次 获取的都是之前注册容器中的单实例对象
    @Bean
    public User user01(){
        return new User("小硅谷",18,"北京海淀区信息大厦");
    }

    @Bean("tomcat")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }

}
